//package com.eastfair.security.aspect;
//
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.eastfair.annotation.annotation.dictionary.Dict;
//import com.eastfair.cache.projectcore.DictionaryCacheKeyBuilder;
//import com.eastfair.cache.repository.CachePlusOps;
//import com.eastfair.core.base.R;
//import com.eastfair.core.context.ContextConstants;
//import com.eastfair.core.dynamic.FieldType;
//import com.eastfair.core.model.CacheHashKey;``````
//import com.eastfair.projectcore.api.DictionaryFeign;
//import com.eastfair.projectcore.entity.Dictionary;
//import com.eastfair.security.util.DictBeanUtils;
//import com.fasterxml.jackson.annotation.JsonFormat;
//import com.fasterxml.jackson.core.JsonProcessingException;
//import com.fasterxml.jackson.databind.ObjectMapper;
//import lombok.extern.slf4j.Slf4j;
//import org.aspectj.lang.ProceedingJoinPoint;
//import org.aspectj.lang.annotation.Around;
//import org.aspectj.lang.annotation.Aspect;
//import org.aspectj.lang.annotation.Pointcut;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//import org.springframework.util.StringUtils;
//
//import java.lang.reflect.Field;
//import java.math.BigDecimal;
//import java.math.BigInteger;
//import java.text.SimpleDateFormat;
//import java.time.LocalDate;
//import java.time.LocalDateTime;
//import java.time.LocalTime;
//import java.util.*;
//
///**
// * @Description: 字典aop类
// * @Author: hzc
// */
//@Aspect
//@Component
//@Slf4j
//public class DictAspect {
////    @Autowired
////    private ISysDictDataService dictService;
//      @Autowired
//      private CachePlusOps cachePlusOps;
//      @Autowired
//      private DictionaryFeign dictionaryFeign;
//
//
//    // 定义切点Pointcut
//    @Pointcut("execution(public * com.eastfair..*.*.*Controller.*(..))")
//    public void excudeService() {
//    }
//
//    @Around("excudeService()")
//    public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
//        long time1 = System.currentTimeMillis();
//        hasMap = new HashMap<>();
//        Object result = pjp.proceed();
//        long time2 = System.currentTimeMillis();
//        log.info("获取JSON数据 耗时：" + (time2 - time1) + "ms");
//        long start = System.currentTimeMillis();
//        this.parseDictText(result);
//        long end = System.currentTimeMillis();
//        log.info("解析注入JSON数据  耗时" + (end - start) + "ms");
//        return result;
//    }
//   private  Map<String,List<Dictionary>> hasMap;
//    /**
//     * TableDataInfo 的分页列表数据进行动态字典注入
//     * 字典注入实现 通过对实体类添加注解@dict 来标识需要的字典内容,字典分为单字典code即可       例如  @Dict(dicCode = "sys_user_sex")
//     * table字典 code table text配合使用     例如  @Dict(dictTable ="sys_depart",dicText = "depart_name",dicCode = "id")表名，需要显示的字段，翻译字段
//     *
//     * @param result
//     */
//    private void parseDictText(Object result) {
//        //如果返回类型是分页
//        if (result instanceof R) {
//            //读取返回数据
//            Object record = ((R) result).getData();
//            if (record != null) {
//                if (record instanceof Page) {
//                    if (null == ((Page) record).getRecords()) {
//                        return;
//                    }
//                    List<JSONObject> items = new ArrayList<>();
//                    //取出返回数据遍历翻译
//                    for (Object records : ((Page) record).getRecords()) {
//                        if (records != null) {
//                            JSONObject item = parseText(records);
//                            items.add(item);
//                        }
//                    }
//                    (((Page) record)).setRecords(items);
//                    //如果返回类型是AjaxResult
//                } else if (record instanceof List) {
//                    //判断是否是list类型
//                    ArrayList<Object> objects = new ArrayList<>();
////                if(objects.size()>0){
//                    for (Object o : (List) record) {
//                        //判断是否是基本类型
//                        boolean wrapClassOrCommonDataType = DictBeanUtils.isWrapClassOrCommonDataType(o.getClass());
//                        boolean b = o instanceof String;
//                        //直接返回
//                        if (wrapClassOrCommonDataType || b) {
//                            objects.add(o);
//                        } else {
//                            //不为null也不为基本类型
//                            if (o != null && !isWrapClass(o)) {
//                                JSONObject item = parseText(o);
//                                objects.add(item);
//                            } else {
//                                objects.add(o);
//                            }
//                        }
//                    }
//                    (((R) result)).setData(objects);
////                }
//                } else if(record instanceof HashMap){
//                   return;
//                } else {
//                    boolean wrapClassOrCommonDataType = DictBeanUtils.isWrapClassOrCommonDataType(record.getClass());
//                    boolean b = record instanceof String;
//                    //如果是基本类型则直接加入返回对象
//                    if (wrapClassOrCommonDataType || b) {
//                        (((R) result)).setData(record);
//                    } else {
//                        //翻译后返回
//                        JSONObject item = parseText(record);
//                        (((R) result)).setData(item);
//                    }
//                }
//            }
//
//
//        }
//    }
//
//    private JSONObject parseText(Object record) {
//        ObjectMapper mapper = new ObjectMapper();
//        String json = "{}";
//        try {
//            //解决@JsonFormat注解解析不了的问题详见SysAnnouncement类的@JsonFormat
//            json = mapper.writeValueAsString(record);
//        } catch (JsonProcessingException e) {
//            log.error("json解析失败" + e.getMessage(), e);
//        }
//        JSONObject item;
//        try {
//             item = JSONObject.parseObject(json);
//        }catch  (Exception exception){
//            item = JSONObject.parseObject("{}");
//        }
//
//        //getAllFields解决继承实体字段无法翻译问题
//        for (Field field : getAllFields(record)) {
//            //如果包含集合继续遍历
//            if (List.class.isAssignableFrom(field.getType())) {
//                try {
//                    //解决private修饰的字段无法反射
//                    if (!field.isAccessible()) {
//                        field.setAccessible(true);
//                    }
//                    //得到集合
//                    List arrayList = (List) field.get(record);
//
//                    List objects = new ArrayList<>();
//                    //继续遍历翻译
//                    if (arrayList != null && arrayList.size() > 0) {
//                        FieldType byField = null;
//                        for (Object o : arrayList) {
//                             byField = FieldType.findByField(o.getClass().getName());
//                            if(byField == null){
//                                Object jsonObject = parseText(o);
//                                objects.add(jsonObject);
//                            }
//
//                        }
//                        if(objects.size()>0){
//                          item.put(field.getName(), objects);
//                        }
//                    }
//                } catch (IllegalAccessException e) {
//                    e.printStackTrace();
//                }
//            }
//
//
//            setDictText(item, field);
//        }
//        return item;
//    }
//
//    /**
//     * 设置最终返回字段
//     *
//     * @param item
//     * @param field
//     */
//    private void setDictText(JSONObject item, Field field) {
//        if (field.getAnnotation(Dict.class) != null) {
//            String code = field.getAnnotation(Dict.class).dicCode();
//            String text = field.getAnnotation(Dict.class).dicText();
//            String table = field.getAnnotation(Dict.class).dictTable();
//            String key = String.valueOf(item.get(field.getName()));
//
//
//
//            if(!hasMap.containsKey(code)){
//                long start = System.currentTimeMillis();
//                CacheHashKey typeKey = new DictionaryCacheKeyBuilder().hashFieldKey(code, Dictionary.class.getName());
//                List<Dictionary> objectList =  cachePlusOps.hGet(typeKey);
//                if(objectList == null) {
//                    try {
//                        objectList = dictionaryFeign.queryDict(code).getData();
//                    }catch (Exception ex){
//                        log.info("调用远程字典接口失败");
//                        objectList = null;
//                    }
//
//                }
//                long end = System.currentTimeMillis();
//                log.info("获取Redis数据  耗时" + (end - start) + "ms");
//                hasMap.put(code,objectList);
//            }
//
//            //翻译字典值对应的txt
//            String textValue = translateDictValue(code, text, table, key,hasMap.get(code));
//
////            log.debug(" 字典Val : " + textValue);
////            log.debug(" __翻译字典字段__ " + field.getName() + Constants.DICT_TEXT_SUFFIX + "： " + textValue);
//            item.put(field.getName() + ContextConstants.DICT_TEXT_SUFFIX, textValue);
//        }
//        //date类型默认转换string格式化日期
//        if (field.getType().getName().equals("java.util.Date") && field.getAnnotation(JsonFormat.class) == null && item.get(field.getName()) != null) {
//            SimpleDateFormat aDate = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//            item.put(field.getName(), aDate.format(new Date((Long) item.get(field.getName()))));
//        }
//        if (field.getType().getName().equals("java.time.LocalDateTime") && item.get(field.getName()) != null) {
//            JSONObject object = (JSONObject) item.get(field.getName());
//            LocalDateTime localDate= LocalDateTime.of(object.getIntValue("year"),object.getIntValue("monthValue")
//                    ,object.getIntValue("dayOfMonth"),object.getIntValue("hour"),object.getIntValue("minute"),object.getIntValue("second"));
//
//            item.put(field.getName(),localDate);
//        }
//        if (field.getType().getName().equals("java.time.LocalDate") && item.get(field.getName()) != null) {
//            JSONObject object = (JSONObject) item.get(field.getName());
//            LocalDate localDate= LocalDate.of(object.getIntValue("year"),object.getIntValue("monthValue")
//                    ,object.getIntValue("dayOfMonth"));
//
//            item.put(field.getName(),localDate);
//
//        }
//        if (field.getType().getName().equals("java.time.LocalTime") && item.get(field.getName()) != null) {
//            JSONObject object = (JSONObject) item.get(field.getName());
//            LocalTime localDate= LocalTime.of(object.getIntValue("hour"),object.getIntValue("minute"),object.getIntValue("second"));
//
//            item.put(field.getName(),localDate);
//        }
//    }
//
//    public static boolean isObjectEmpty(Object object) {
//        if (object == null) {
//            return (true);
//        }
//        if ("".equals(object)) {
//            return (true);
//        }
//        if ("null".equals(object)) {
//            return (true);
//        }
//        return (false);
//    }
//
//    /**
//     * 翻译字典文本
//     *
//     * @param code
//     * @param text
//     * @param table
//     * @param key
//     * @return
//     */
//    private String translateDictValue(String code, String text, String table, String key,List<Dictionary> objectList) {
//        if (isObjectEmpty(key)) {
//            return null;
//        }
//        StringBuffer textValue = new StringBuffer();
//        String[] keys = key.split(",");
//        for (String k : keys) {
//            String tmpValue = null;
////            log.debug(" 字典 key : "+ k);
//            if (k.trim().length() == 0) {
//                continue; //跳过循环
//            }
//            //数据表翻译
//            if (!StringUtils.isEmpty(table)) {
////                log.debug("--DictAspect------dicTable="+ table+" ,dicText= "+text+" ,dicCode="+code);
//                tmpValue = "123"; //dictService.queryTableDictTextByKey(table,text,code,k.trim());
//                //字典翻译
//            } else {
//                //看一下map里是否有过缓存,没有则查询数据库构造map存储
//
////                List<SysDictData> sysDictData = dictService.selectDictDataByType(code);
////                Map<String, String> collect = sysDictData.stream()
////                        .collect(Collectors.toMap(SysDictData::getDictValue, SysDictData::getDictLabel, (key1, key2) -> key2));
////
//                if(objectList != null){
//                    for (Dictionary di:objectList) {
//                        if(di.getCode().equals(k.trim())){
//                            tmpValue = di.getName();
//                            break;
//                        }
//
//                    }
//                }
//
//            }
//            if (tmpValue != null) {
//                if (!"".equals(textValue.toString())) {
//                    textValue.append(",");
//                }
//                textValue.append(tmpValue);
//            }
//
//        }
//        return textValue.toString();
//    }
//
//    /**
//     * 获取类的所有属性，包括父类
//     *
//     * @param object
//     * @return
//     */
//    public static Field[] getAllFields(Object object) {
//        Class<?> clazz = object.getClass();
//        List<Field> fieldList = new ArrayList<>();
//        while (clazz != null) {
//            fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
//            clazz = clazz.getSuperclass();
//        }
//        Field[] fields = new Field[fieldList.size()];
//        fieldList.toArray(fields);
//        return fields;
//    }
//
//    /**
//     * 判断一个对象是否是基本类型或基本类型的封装类型
//     */
//    private boolean isWrapClass(Object obj) {
//        return isBaseDataType(obj.getClass());
//    }
//    /**
//     * 判断一个类是否为基本数据类型。
//     *
//     * @param clazz
//     *            要判断的类。
//     * @return true 表示为基本数据类型。
//     */
//    public static boolean isBaseDataType(Class clazz) {
//        return (clazz.equals(String.class)
//                || clazz.equals(Integer.class)
//                || clazz.equals(Byte.class)
//                || clazz.equals(Long.class)
//                || clazz.equals(Double.class)
//                || clazz.equals(Float.class)
//                || clazz.equals(Character.class)
//                || clazz.equals(Short.class)
//                || clazz.equals(BigDecimal.class)
//                || clazz.equals(BigInteger.class)
//                || clazz.equals(Boolean.class)
//                || clazz.equals(java.sql.Date.class)
//                || clazz.isPrimitive());
//    }
//
//}
